#!/usr/bin/python
#-*-coding: utf-8 -*-


from path import Path
#from PyQt4.QtGui import QTextCursor, QIcon, QColor
#from config import ICONS_DIR#,QTGUI_DIR
from doctest import testmod
import sys,shutil,os

#rouge  = QColor(255,0,0)
#vert   = QColor(0,255,0)
#bleu   = QColor(0,0,255)
#noir   = QColor(0,0,0)
#blanc  = QColor(255,255,255)
#enable = blanc
#disable = QColor(230,230,230)
#warn   = QColor(230,230,255) 
#error  = QColor(255,230,230)
"""Pierre Puiseux lundi 29 novembre 2010"""

def listOthers(compact=None):
    u"""Retourne une liste de noms d'elements
    - si compact=None => tous les noms d'elements 'others'
    - si compact=True => liste des noms d'elements 'others' pour format compact
    - si compact=False => liste des noms d'elements 'others' pour format non compact"""
    
    COMPACT_FILES = ('ntg', 'dxdydz', 'permxyz')
    
    UNCOMPACT_FILES = ('ntg', 'dx', 'dy', 'dz', 
                       'permx', 'permy', 'permz')

    if compact==None : return COMPACT_FILES+UNCOMPACT_FILES[1:]
    elif compact==True : return COMPACT_FILES
    elif compact==False : return UNCOMPACT_FILES
        

def safeSave(string, filepath):
    u"""
    Sauvegarde sécurisée
    """
#    try : 
#    string = unicode(string, 'utf-8')
#    except UnicodeEncodeError : print "encodage?"
    if not filepath.dirname.isdir() :
#        print>>sys.stderr, u"Sauvegarde impossible : {0} n'est pas un répertoire.".format(filepath.dirname)
#        raise IOError(u"Sauvegarde impossible : {0} n'est pas un répertoire.".format(filepath.dirname))
        return False, u"Sauvegarde impossible : {0} n'est pas un répertoire.".format(filepath.dirname)
    try : 
        temp = filepath+u'.tmp'
        open(temp,'w').write(string)
    except IOError :
#        print>>sys.stderr, u"Impossible de sauvegarder {0}.\nVérifiez les droits d'écriture du répertoire.".format(filepath)
#        raise IOError(u"Impossible de sauvegarder {0}.\nVérifiez les droits d'écriture du répertoire.".format(filepath))
        return False,u"Impossible de sauvegarder {0}.\nVérifiez les droits d'écriture du répertoire.".format(filepath)
    except UnicodeEncodeError : 
#        raise UnicodeEncodeError(u"Impossible de sauvegarder {0}.\nPPROSCRIRE LES CARACTERES NON ASCII (pas de caractères accentués).".format(filepath))
#        print>>sys.stderr, u"Impossible de sauvegarder {0}.\nPPROSCRIRE LES CARACTERES NON ASCII (pas de caractères accentués).".format(filepath)
        return False, u"Impossible de sauvegarder {0}.\nPPROSCRIRE LES CARACTERES NON ASCII (pas de caractères accentués).".format(filepath)
        
    try : 
        if filepath.isfile() : 
            os.rename(filepath, filepath+u'.bak')
        os.rename(temp, filepath)
    except IOError : 
#        print>>sys.stderr, u"Impossible de sauvegarder {0}.\nVérifiez les droits d'écriture du fichier.".format(filepath)
        return False, u"Impossible de sauvegarder {0}.\nVérifiez les droits d'écriture du fichier.".format(filepath)
    return True, u''
        
#def couleur(statut=u'normal'):
#    statut = statut.strip().lower()
#    if statut == 'normal': return noir
#    elif statut in (u'desactive', u'desactivé', u'disable',u'disabled') :
#        return disable
#    elif statut in (u'error', u'erreur'):
#        return error
#    elif statut in (u'warning', u'double', u'doublon', u'attention'):
#        return warn

def upath(*p):
    return Path(*[unicode(x) for x in p])

def apath(*p):
    return upath(*p).abspath

def testPrint(msg):
    print>>sys.stderr,("stderr",msg)
    print>>sys.stdout,("stdout",msg)

def doublon(L):
    """renvoit la liste des doublons de liste
    >>> doublon(['a','b','b','c','c'])
    [1,2], [3,4]    
    >>> doublon(['a','b','b','c','b'])
    [1,2,4]
    """
    D = {}
    while L :
        a = L.pop()
        try : 
            D[a] = (len(L),) + D[a]
        except KeyError :
            D[a]=(len(L),)
    res = []
    for key,val in D.items() :
        if len(val)>1 : 
            res.append(D[key])
    
    return res    
 
class InfoWriter:
    u"""
    presentation des infos
    >>> writer = InfoWriter()
    >>> writer.write('niveau 0 : ',level=0)
    => niveau 0 : 
    >>> writer.write('niveau 1 : ',level=1)
        * niveau 1 : 
    >>> writer.write('niveau 1 toujours : ')
        * niveau 1 toujours : 
    >>> writer.write('niveau 1 toujours : ', bullet=False)
        niveau 1 toujours : 
    >>> writer.write('niveau 1 encore !! : ')
        * niveau 1 encore !! : 
    >>> writer.write('niveau 2 : ',level=2)
            - niveau 2 : 
    """
    def __init__(self, bullets=(u'=>',u'*',u'-'), indent=4):
        self.bullets = bullets
        self.indent = indent
        self.lastlevel = -1#le dernier niveau
    
    def write(self, msg, level=-1, bullet=True, where=sys.stdout):
        if level == -1 : 
            level = self.lastlevel
        bul = u''
        if bullet : 
            try : 
                bul = self.bullets[level]+u' '
            except IndexError :
                pass
             
        lf = u'\n' if level == 0 else u''
        indent = (level*self.indent)*' '
#        where.write (lf+indent + bul + msg)
        try :
            print>>where, (lf + indent + bul + msg)
        except UnicodeDecodeError:
            print>>sys.stderr, "Erreur de syntaxe"
        except UnicodeEncodeError:
            print>>sys.stderr, "Erreur de syntaxe"
        self.lastlevel = level
        
class OutLog:
    """from http://www.riverbankcomputing.com/pipermail/pyqt/2009-February/022025.html"""
    def __init__(self, edit, out=sys.stdout, color=None):
        """(edit, out=None, color=None) -> can write stdout, stderr to a
        QTextEdit.
        edit = QTextEdit ou QTextBrowser
        out = alternate stream ( can be the original sys.stdout )
        color = alternate color (i.e. color stderr a different color)
        """
        self.edit = edit
        self.out = out
        self.color = color

    def write(self, m):
#        self.edit.moveCursor(QTextCursor.End)
        self.edit.insertPlainText(m)

    def setTextColor(self, color):
#        self.edit.SelectAll()
        self.edit.setTextColor(color)

import os.path
def which(filename):
    """equivalent du 'which' de unix"""
    locations = os.environ.get("PATH").split(os.pathsep)
    candidates = []
    for location in locations:
        candidate = os.path.join(location, filename)
        if os.path.isfile(candidate):
            candidates.append(candidate)
    return candidates    

if __name__=='__main__':
    print apath("hello")
    testmod()
    doublon(['a','b','b','c','c'])
#    writer = InfoWriter()
#    writer.write('niveau 0 : ',level=0)
#    writer.write('niveau 1 : ',level=1)
#    writer.write('niveau 1 toujours : ')
#    writer.write('niveau 1 toujours : ', bullet=False)
#    writer.write('niveau 1 encore !! : ')
#    writer.write('niveau 2 : ',level=2)
    
